#include "App_Uart.h"
#include "Bsp_Uart.h"

Uart_Str Uart_Control;

fsm_sta_t Uart_App(FSM_TaskID id)
{
    fsm_sta_t *Status = FSM_GetSta(id);

    if (*Status & Uart_Init_Evt)
    {
        BSP_UART_Init(&COM1);
        BSP_UART_Printf(&COM1, "COM1 Init OK\n");
        Uart_Control.Uart1_485_Sta = 0;

        FSM_Task_Start(id, Uart_Time_Evt, 10);

        return *Status ^= Uart_Init_Evt;
    }

    if (*Status & Uart_Time_Evt)
    {
        // 485 半双工
        if (COM1.Uart_RxTimeOut > 0)
        {
            COM1.Uart_RxTimeOut--;

            if (COM1.Uart_RxTimeOut == 0)
            {
                BSP_UART_SendBuff(&COM1, COM1.Uart_RxBuf, COM1.Uart_Rx_Cnt);

                // 重新开始接收
                BSP_UART_RxStart(&COM1);
            }

            // 周期运行
            FSM_Task_Start(id, Uart_Time_Evt, 1);
        }
        else if (BSP_UART_GetTxBusy(&COM1))
        {
            // 需要发送数据
            switch (Uart_Control.Uart1_485_Sta)
            {
            case 0:
                UART1_DIR_TXE();
                Uart_Control.Uart1_485_Sta = 1;
                break;

            case 1:
                // 开始发送
                BSP_UART_TxStart(&COM1);

                Uart_Control.Uart1_485_Sta = 2;
                break;

            default:
                break;
            }

            // 周期运行
            FSM_Task_Start(id, Uart_Time_Evt, 10);
        }
        else
        {
            // 485 接收模式
            UART1_DIR_RXE();
            Uart_Control.Uart1_485_Sta = 0;

            // 周期运行
            FSM_Task_Start(id, Uart_Time_Evt, 5);
        }

        return *Status ^= Uart_Time_Evt;
    }

    return 0;
}
